<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //1.定义函数有几种方式
          /** 
           三种
           函数声明式：声明一个有函数名的函数并调用
           函数表达式(匿名函数)：没有函数名的函数，将右侧的匿名函数赋值给一个变量
           立即执行函数:函数声明完；立即被调用，且只会执行一次
          **/
         //2.return关键字的作用
         /**
            使函数停止，并返回指定的值
        **/
        //3.函数实参和形参个数不等时会发生什么？举例说明
    
         //  当形参大于时参时，多出来的形参没有对应的实参赋值，输出的值都是 undefined,和Nan
             function add(a,b,c){
                 console.log(a+b+c);
             }
             add("今","天");//今天undefined
       // 当实参大于形参时，多出来的实参没有对应的形参传入就会丢失
             function app(x,z){
                 console.log(x+z);
             }
             app(1,2,6)//3    


        //4.var 和function 关键字有什么特别功能？
        /**
           var 变量提升，变量声明会被放在执行环境的顶部，
           function 函数声明提升，函数声明会被放在执行环境顶部且不会被变量声明覆盖但会被变量赋值覆盖
        **/
       //5.请定义一个函数，该函功能为，转入一个值，返回这个值的平方值；请再写一个函数，功能为：传入两个值，分别是x和y，返回x的y次方结果
                function add(n){
                    var sun=0;
                    for(var a=0;a<=n;a++){
                        sun=a*a//a的a次方
                    }console.log(sun);
                    
                }       add(10)
                 
                function add(n,s){
                    var sun=0; //定义变量盒子                
                     sun=n**s//**等于x的y次方
                           
                    console.log(sun); 
                }add(3,4)
                    
       //6.请写出一个函数，功能为：传入2个值，则返回其中的最大值，请再写一个函数，传入3个值，返回其中的最大值。
           function add(a,b){
               if(a>b){
                return   a;
                
               }else  if(b>a){
                    return   b;
               }
           }
         console.log(add(2,6));
                 
         function two(a,b,c){
                   if(a>b&&a>c){
                       return  a;
                   }else if(b>a&&b>c)
                   {
                        return  b;
                   }
                     else if(c>a&&c>b){
                     return c;
                    }else if(a=b=c){
                        return "他们相等"
                    }
               }
                console.log(two(10,10,10));
         //7.请定义一个函数，输入一个N值，则计算该值的阶乘，即'n! =1*2*3*4*5*6...*N'
         function add(n){
                  var sum=1;
                        //循环次数小于输出的值
                for (var a=1;a<=n;a++){     
                   sum =sum*a//每阶乘的值    
                }
                console.log("阶乘的值"+sum+"");
         }    add(3)

       //8. 以下代码的 console.log 打印的是什么，并解释原因，写出分析过程。
        console.log(a);
       var a = 1;
      console.log(a);
      function a() {
        console.log(2);
      } //函数声明会提升 将声明函数致于顶部 覆盖变量声明

      console.log(a);
      var a = 3; //变量声明置顶，在函数声明下方，
      console.log(a);
      function a() {
        console.log(4);
      }
      console.log(a);
      a(); 
       输出结果为 1 1 1 3 3
       相当于以下代码
    
        function a() {
        console.log(4);
      }
      function a() {
        console.log(2);
      }
      var a
       a = 1;
       console.log(a);
      console.log(a);
      console.log(a);
       a= 3;
      console.log(a);
      console.log(a);
      a(); 
     因函数声明提升会被变量赋值覆盖，所以变量a的值会打印出来
    </script>
</body>
</html>